﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PersonDeepShallow
{
public:
	PersonDeepShallow()
	{
	}
	//2.初始化属性；
	PersonDeepShallow(const char* name, int age)
	{
		m_Name = (char*)malloc(strlen(name) + 1);
		strcpy(m_Name, name);

		m_Age = age;
	}
	//3.拷贝构造；系统会提供默认拷贝构造，而且是简单的值拷贝，是浅拷贝；浅拷贝，只会拷贝栈区的值，不会拷贝
		//堆区的字符串，所以析构函数回收内存时，系统会挂掉；因为p1调用析构后，堆区已经被回收了，p2进行浅拷贝
		//只能拷贝栈区的地址，而地址指向的堆内存值已经清空了，p2再次调用析构时系统就崩了；
	//5.自己提供拷贝构造，因为简单的浅拷贝会释放堆区空间两次，导致挂掉；这次自己提供了深拷贝；
	PersonDeepShallow(const PersonDeepShallow& p)
	{
		m_Age = p.m_Age;
		m_Name = (char*)malloc(strlen(p.m_Name) + 1);
		strcpy(m_Name, p.m_Name);
	}

	~PersonDeepShallow()
	{
		cout << "4.调用了析构函数！" << endl;
		if (m_Name != NULL)
		{
			free(m_Name);
			m_Name = NULL;
		}
	}

	//1.姓名和年龄；
	char* m_Name;
	int m_Age;
};
void testDeepShallow()
{
	PersonDeepShallow p1("达芬奇", 10);//4.调用了析构函数！
	//6.调用了拷贝构造；
	PersonDeepShallow p2(p1);//4.调用了析构函数！

}

//main261：深拷贝和浅拷贝
int main261()
{
	testDeepShallow();

	system("pause");
	return EXIT_SUCCESS;
}